package modelo;
import java.util.*;
import java.awt.Point;
import java.util.Iterator;
import java.util.Observable;
import org.jdom.Document;
import org.jdom.Element;

import excepciones.XMLUnserializeException;
import extras.xml.SerializableXML;

public class Pista extends Observable implements SerializableXML<Element> {
	private int posicionInicialEnAncho;
	
	Casillero[][] pista; /* [ANCHO][LARGO] */
    private Auto auto;
	private int posicionEnAncho;
	private int posicionEnLargo;
	private int anchoDePista;
	private int largoDePista;
	private MejoresTiempos mejoresTiempos;
	private Carrera carrera;
	
	/**
	 * Se crea una pista de prueba a partir de un entero, para las pruebas.
	 */
	public Pista(int largoAsfalto,int largoTierra,int largoRipio) {
		pista = new Casillero[5][100];
		for(int i=0;i<5;i++){
		   for(int j=0;j<largoAsfalto; j++){
			   pista[i][j]=new Casillero();
			   pista[i][j].setSuperficie(Asfalto.getInstance());
		   }
		
		   for(int j=largoAsfalto;j<largoAsfalto+largoTierra; j++){
			   pista[i][j]=new Casillero();
			   pista[i][j].setSuperficie(Tierra.getInstance());
		   }
		   for(int j=largoAsfalto+largoTierra;j<largoTierra+largoRipio; j++){
			   pista[i][j]=new Casillero();
			   pista[i][j].setSuperficie(Ripio.getInstance());
		   }
		   
		}           

		pista[2][0].setObstaculo(Pozo.getInstance());
		pista[2][3].setObstaculo(Pozo.getInstance());
		pista[2][5].setObstaculo(Pozo.getInstance());
		pista[2][6].setObstaculo(Pozo.getInstance());
		pista[2][8].setObstaculo(Pozo.getInstance());
		pista[2][9].setObstaculo(Pozo.getInstance());
		pista[2][10].setObstaculo(Pozo.getInstance());
		
		auto = null;
		carrera = null;
	//    posicionEnAncho = 2;
	    posicionInicialEnAncho = 2;
	posicionEnLargo = 0;
		anchoDePista = 5;
		largoDePista = 100;
		mejoresTiempos = new MejoresTiempos();
	}
	
	/**
	 * Se crea una pista a partir del elemento xml recibido.
	 */
	public Pista(Element xmlElement) throws XMLUnserializeException {
	}
	
	public Element toXML() {
		return null;
	}	
	
    public void colocarAuto(Auto auto){
    	 auto.setPista(this);
         this.auto = auto;
         posicionEnAncho = posicionInicialEnAncho;
         posicionEnLargo = 0; // siempre se empieza desde el cero
         addObserver(auto.getRuedas());
    }

	public Casillero getCasillero() {
		return this.pista[posicionEnAncho][posicionEnLargo];
	}

	public Auto getAuto() {
		return auto;
	}

	public void moverAutoHaciaLaDerecha() {
		if (posicionEnAncho != anchoDePista-1){
			posicionEnAncho++;
			notificarObservadores();
		}
		
	}
	
	public void moverAutoHaciaLaIzquierda() {
		if (posicionEnAncho != 1){
			posicionEnAncho--;
			notificarObservadores();
		}
	}
	
	public void moverAutoHaciaAdelante() {
		if (this.getPosicionEnLargo() != this.getLargo() -1)
			posicionEnLargo++;
		else{
			this.getCarrera().setGano(true);
			this.getCarrera().finalizar();
		}
		notificarObservadores();
	}

	public long getLargo() {
		return largoDePista;
	}

	public int getPosicionEnLargo() {
		return this.posicionEnLargo;
	}
	
	public int getPosicionEnAncho() {
		return this.posicionEnAncho;
	}
	
	public MejoresTiempos getMejoresTiempos() {
		return this.mejoresTiempos;
	}
	
    public void notificarObservadores(){
    	setChanged();
    	notifyObservers();
    }

	public void setCarrera(Carrera carrera) {
		this.carrera = carrera;
	}
	
	public Carrera getCarrera() {
		return carrera;
	}
}

